package com.qfmy.config;

import com.qfmy.core.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @ClassName: InterceptorConfig
 * @author： zhengjt
 * @data： 2022/6/6 15:04
 * @version：1.0
 * @描述： 配置类，用于实现 WebMvcConfigurer
 *          @Configuration : 用于声明该类是一个注册类
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Autowired
    private LoginArgumentResolvers loginArgumentResolvers;

    /**
     * 参数解析器：
     *  用来在进入controller方法前，对参数进行对应的处理
     * @param resolvers
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        //  LoginArgumentResolvers类处理Controller的传入参数
        resolvers.add(loginArgumentResolvers);
    }

    /**
     * 跨域配置
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 设置允许跨域的路径
        registry.addMapping("/**")
                // 设置允许跨域请求的域名
//                .allowedOrigins("*")
                .allowedOriginPatterns("*")
                // 是否允许证书
                .allowCredentials(true)
                // 设置允许的方法
                .allowedMethods("POST", "GET", "PUT", "PATCH", "OPTIONS", "DELETE")
                //  设置允许 authorization 可在响应头中出现
                .exposedHeaders("authorization")
                // 设置允许的header属性
                .allowedHeaders("*")
                // 跨域允许时间
                .maxAge(3600);
    }


    /**
     * 拦截器配置
     *      addInterceptor：需要一个实现HandlerInterceptor接口的拦截器实例
     *      addPathPatterns：用于设置拦截器的过滤路径规则；addPathPatterns("/**")对所有请求都拦截
     *      excludePathPatterns：用于设置不需要拦截的过滤规则
     *      PS： 拦截器主要用途：进行用户登录状态的拦截，日志的拦截等
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns(
                        "/test",
                        "/test/getToken",
                        "/openApi/**",
                        "/login",
                        "/js/**",
                        "/css/**",
                        "/images/**"
                );

    }

}
